package org.geekbang.ioc.java.beans;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyEditorSupport;
import java.util.stream.Stream;

/**
 * {@link BeanInfo} 示例
 *
 * @author <a href="https://binghuojxj.com.cn/">binghuojxj</a>
 * @since
 */
public class BeanInfoDemo {
    public static void main(String[] args) throws IntrospectionException {
        //获取 BeanInfo
        BeanInfo beanInfo = Introspector.getBeanInfo(User.class,Object.class);

        //通过 Lambda 表达式输出 propertyDescriptor
        Stream.of(beanInfo.getPropertyDescriptors())
                .forEach(propertyDescriptor -> {
                    System.out.println(propertyDescriptor);
                });

        //自定义类型转换属性编辑器使用示例
        Stream.of(beanInfo.getPropertyDescriptors())
                .forEach(propertyDescriptor -> {
                    //propertyDescriptor 允许添加属性编辑器 PropertyEditor
                    //比如使用场景 GUI Text（String） -> PropertyType（Integer）
                    //name -> String
                    //age -> Integer
                    Class<?> propertyType = propertyDescriptor.getPropertyType();
                    String propertyName = propertyDescriptor.getName();
                    //为age 属性添加 属性编辑器 PropertyEditor
                    if("age".equals(propertyName)){
                        //String -> Integer
                        propertyDescriptor.setPropertyEditorClass(StringToIntegerPropertyEditor.class);

                        //propertyDescriptor.createPropertyEditor()
                    }
                });
    }

    /**
     * 自定义类型转换属性编辑器
     * 为后面Spring 的类型转换打下坚实基础
     *
     */
    static class StringToIntegerPropertyEditor extends PropertyEditorSupport{
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            Integer value = Integer.valueOf(text);
            //这里setValue的目的是为了后续的 getValue做准备
            setValue(value);
        }
    }
}
